use std::net::UdpSocket;
mod lora;
use lora::handle_lora_data;

const LORA_START: usize = 0;
const MINI_LORA: usize = 4;

fn main() -> std::io::Result<()> {
    let addr = "192.168.1.189:1700"; // 更改为您的实际地址
    let socket = UdpSocket::bind(&addr)?;
    println!("监听 {}", &addr);

    let mut buf = [0; 1024];

    loop {
        match socket.recv_from(&mut buf) {
            Ok((amt, src)) => {
                let dest_addr = &src.to_string();
                println!("接收 {} bytes 来自 {} 接收的原始数据流为 {:?}, 他的类型{}", amt, src, buf, buf[LORA_START]);

                if amt >= LORA_START + MINI_LORA && buf[LORA_START] == 0x02 {
                    let lora_data = &buf[LORA_START..amt];
                    match handle_lora_data(lora_data, &socket, dest_addr) {
                        Ok(message) => println!("处理成功: {:?}", message),
                        Err(e) => println!("处理失败: {}", e),
                    }
                } else {
                    println!("LoRa数据的起始标志不正确，丢包");
                }
            }
            Err(e) => {
                //防止发送方在消息完成前断开链接导致本项目关闭。
                println!("接收数据时发生错误: {}", e);
            }
        }
    }
}
